/*************************************************************************
 > File Name: database.h
 > Author: LiuTianpeng
 > Mail: ltpforever@163.com 
 > Created Time: 2017年07月24日 星期一 10时08分26秒
 ************************************************************************/

#ifndef _DATABASE_H_
#define _DATABASE_H_

#ifdef __cplusplus
extern "C" {
#endif
#define DB_DIR_PATH "/usr/local/sanway/dbTest/"
#define TRAN_RECORD_PATH "/usr/local/sanway/dbTest/tcuaccount.db"
#define ERROR_RECORD_PATH "/usr/local/sanway/dbTest/tcuerror.db"
#define PRICE_MODE_PATH "/usr/local/sanway/dbTest/tcuprice.db"
#define CONFIG_FILE_PATH "/usr/local/sanway/dbTest/tcuconfig.db"
#define CARD_PATH  "/usr/local/sanway/dbTest/tcucard.db"
#define BLACKLIST_CARD_PATH  "/usr/local/sanway/dbTest/tcublacklistcard.db"
#define GUNINFO_PATH  "/usr/local/sanway/dbTest/tcuguninfo.db"
#define CODE_PATH "/usr/local/sanway/dbTest/tcucode.db"

#define CACHE_PATH "/usr/local/sanway/dbTest/cache"
#define TRAN_CACHE_FILE "_tcuaccount.db"
#define ERROR_CACHE_FILE "_tcuerror.db"
#define LEN_SER    32

typedef struct dbl_lnk {
	struct dbl_lnk *prev;
	struct dbl_lnk *next;
} DBL_LNK;

typedef enum {
	TRAN_START = 0x55,  //充电开始，第一次插入
	TRAN_OFFLINE = 0x66, //充电结束，离线未上传
	TRAN_TEM = 0x77,  //每次时段结束时保存
	TRAN_END = 0xaa,  //充电结束，已经上传
	TRAN_FAIL = 0xFF,  //交易记录无法成功上传到后台
} TRAN_STATE;  //交易记录上传后台状态

typedef enum {
	TABLE_NW=0,  //南网通用交易记录数据库类型
	TABLE_XJ,  //小桔交易记录数据库类型
	TABLE_YCT,  //羊城通交易记录(刷卡结算)
	TABLE_QL
} TARNRD_TABLE_TYPE;

typedef struct {
	DBL_LNK l;
	unsigned char guntab; //充电接口标识
	unsigned char flag_finished;
	unsigned char serialnum[32]; // 交易流水号  17062392244
	unsigned char starttime[7]; // 开始时间
	unsigned char endtime[7]; // 结束时间
	unsigned int charge_duration; //充电持续时间
	unsigned int start_soc;    // 电池起始电量 
	unsigned int end_soc;       // 电池结束电量
	unsigned char userId[8];    // 
	unsigned char cardId[8];    // 
	unsigned char stop_reason; //充电停止原因
	unsigned int w_start; // 电量开始示值
	unsigned int w_end; // 电量停止示值
	unsigned int w[49]; // 本次充电电能量
	unsigned int cost_elec; //当前服务费电费  保留小数点2位
	unsigned int cost_server; //当前服务费  保留小数点2位
	unsigned char carlogo[17]; //电动汽车唯一标识
	unsigned char billmode; //充电策略0:充满为止（默认） 1:时间控制充电 2:金额控制充电 3:电量控制充电 4:按 SOC 控制充电
	unsigned int chargevalue; //充电策略参数时间单位为 1 秒 金额单位为 0.01 元 电量时单位为 0.01kw SOC 单位为%
	unsigned char startmode; //1 远程充电 0 卡充电
	unsigned int g_stop_detail; //由于故障发生的停止充电的具体故障编码
} tran_record_xj; //小桔交易记录

/*本结构为羊城通读卡器未完整消费处理信息结构*/
typedef struct {
	unsigned char logic_cardNum[8]; //逻辑卡号
	unsigned char cardNum[8]; //物理卡号
	int ticket_trade_count; //票卡交易计数器   未完整交易记录的“票卡消费交易计数”。
	int trade_money; //交易金额  未完整交易记录的“本次交易的交易金额”
	int balance; //本次余额  未完整交易记录的“ 本次余额”
} yct_incomplete_trade;

typedef struct {
	DBL_LNK l;
	unsigned char guntab; //充电接口标识
	unsigned char flag_finished;
	unsigned char serialnum[16]; // 交易流水号
	unsigned char starttime[7]; // 开始时间
	unsigned char endtime[7]; // 结束时间
	unsigned int charge_duration; //充电持续时间
	unsigned char payCard[8]; // 支付卡唯一标识号
	unsigned char userId[8];
	unsigned char cardId[8];
	char modelID[8];					//计费模型ID
	unsigned char stop_reason; //充电停止原因
	unsigned char billbytm; //  yes=0 no=1  分时计费标志
	unsigned int w_start[5]; // 电量开始示值 总尖峰平谷
	unsigned int w_end[5]; // 电量结束示值 总尖峰平谷
	unsigned int w[5]; // 本次充电电能量 总尖峰平谷
	unsigned int cost_elec[5]; //电费 保留小数点2位
	unsigned int cost_server; //当前服务费  保留小数点2位
	unsigned int cost_Parking; //占位费，保留小数点2位
	unsigned int rateprice[7]; /*    尖费率
	 峰费率
	 平费率
	 谷费率
	 服务费单价
	 停车费单价
	 预约费单价*/

	unsigned char carlogo[17]; //电动汽车唯一标识

	/*刷卡结算追加 只有当数据库类型为TABLE_YCT时才会操作追加部分*/
	unsigned char flag_card_settled; //0x55 未结算  0xaa已经结算
	unsigned char TAC[4]; //交易识别码
	yct_incomplete_trade yct_nosettle_trade; //刷卡未完整交易(未结算)

} tran_record; //南网通用交易记录

typedef struct {
	DBL_LNK l;
	char guntab; //枪编号
	char time[7]; //事件时间
	char type; //故障类型
} err_record; //故障记录

//typedef struct
//{
//	char  settag1; //系统设置1完成，由UI设置为1，主控程序处理后置0
//	char  bittag1;  //每一位标识一个参数设置，由UI设置为1，主控程序处理后置0
//	char  p1[8];  //设备编号
//
//	char  settag2; //系统设置2完成，由UI设置为1，主控程序处理后置0
//	short  bittag2;  //每一位标识一个参数设置，由UI设置为1，主控程序处理后置0
//	char  p2[64];  //APN
//	unsigned  char  p3[4];  //远程IP1
//	unsigned int	 p4; //远程端口1
//	unsigned  char  p5[4];  //远程IP2
//	unsigned int	 p6; //远程端口2
//	unsigned  char  p7[4];  //网口1 IP
//	unsigned  char  p8[4];  //网口 1 子网掩码
//	unsigned  char  p9[4];  //网口1 网关
//	unsigned  char  p10[4];  //网口2 IP
//	unsigned  char  p11[4];  //网口 2 子网掩码
//	unsigned  char  p12[4];  //网口2 网关
//
//	char  settag3; //系统设置3完成，由UI设置为1，主控程序处理后置0
//	float  p13[11];//额定电压，过压阀值，欠压阀值，过压恢复阀值，欠压恢复阀值，
//				   //额定电流，过流阀值，欠流阀值，过流恢复阀值，欠流:恢复阀值，持续时间
//
//}sysset_cmd; //系统设置
//
//
//typedef struct
//{
//	short time;  //起始时间
//    char tag;    //时段标志, 1：尖时段 2：峰时段 3：平时段 4：谷时段
//}timeseg;
//
//typedef struct{
//	DBL_LNK l;
//	char guntab; //充电接口标识
//	char modelID[8] ;//计费模型ID
//	char starttime[7];// 开始时间
//	char endtime[7]; // 结束时间
//	short opstate;   //执行状态
//	short metertype;   //计量类型
//	char num;				//时段数 0-12
//	timeseg  time[12];  //尖时段起始时间
//						//峰时段起始时间
//						//平时段起始时间
//						//谷时段起始时间
//
//	int  rateprice[7];  //尖时段电价
//						//峰时段电价
//						//平时段电价
//	   				    //谷时段电价
//					    //服务费单价
//					    //停车费单价
//					    //预约费单价
//} charg_model;//计费模型

typedef struct {
	DBL_LNK l;
	unsigned char guntab; //充电接口标识
	unsigned char flag_finished;
	unsigned char serialnum[32]; // 交易流水号  17062392244
	unsigned char starttime[7]; // 开始时间
	unsigned char endtime[7]; // 结束时间
	unsigned int charge_duration; //充电持续时间
	unsigned int start_soc;    // 电池起始电量
	unsigned int end_soc;       // 电池结束电量
	unsigned char userId[8];    //
	unsigned char cardId[8];    //
	unsigned char stop_reason; //充电停止原因
	unsigned int w_start; // 电量开始示值
	unsigned int w_end; // 电量停止示值
	unsigned int w[49]; // 本次充电电能量
	unsigned int cost_elec; //当前服务费电费  保留小数点2位
	unsigned int cost_server; //当前服务费  保留小数点2位
	unsigned char carlogo[17]; //电动汽车唯一标识
	unsigned char billmode; //充电策略0:充满为止（默认） 1:时间控制充电 2:金额控制充电 3:电量控制充电 4:按 SOC 控制充电
	unsigned int chargevalue; //充电策略参数时间单位为 1 秒 金额单位为 0.01 元 电量时单位为 0.01kw SOC 单位为%
	unsigned char startmode; //1 远程充电 0 卡充电
	unsigned int g_stop_detail; //由于故障发生的停止充电的具体故障编码
} tran_record_ql; //ql交易记录

typedef struct {
	unsigned char card_id[8]; //管理卡卡号
	char card_type; //A卡=0x0A, B卡=0x0B
	char card_order; //A卡(order = 1,2), B卡(order = 3,4,5)表示A1，A2，B2，B3，B4
} admin_card; //管理卡

typedef struct {
	int db_tran_type;
	int db_err_type;
	int db_card_type;
} db_register;

typedef struct {
	char cardNum[8]; //卡号
	char state; // 1-挂失 2-解挂
} blacklist_card; //黑名单

typedef struct {
	unsigned char gunno; //自动生成序号，也是逻辑枪号
	unsigned char can_port; // can端口号 0,1
	unsigned char frame_gunno;    //控制器在can帧中的枪号
	unsigned char cha_addr; // 控制器can地址 默认0xf6
	unsigned char mt_port; //电表（485)端口号
	unsigned char phase_num; //1单相表  3三相表
	unsigned char meteraddr[6];
	unsigned int ct;//互感器变比
} Gun_Info;//充电枪信息

#define CONTEXT_LEN 128
typedef struct{
	char context[CONTEXT_LEN];//信息描述
	unsigned int sw_code;//晟伟编码
	unsigned int xj_code;//小桔编码
}Display_Code;//故障代码/停止原因显示对应表

typedef struct{
	unsigned int power_rate[48];//精确度0.0001 数据库读写data均为无符号整型 由于实际费率real_rate为浮点型 data=real_rate*10000   real_rate=data/10000
	unsigned int service_rate[48];
}xj_price_model;

//数据库注册，标注各表的类型 0成功 1失败
int protocol_database_register(db_register* data);

//充电记录更新、查询
/*precord是指向tran_record的指针，成功返回ERROR_OK*/
int protocol_updateCD(void *precord);

/*
 * 删除交易记录
 *  成功：返回0   失败：返回非0负值
 * */
int protocol_deleteCD(void *precord);

/*precord是指向tran_record的数组，
 *  数组大小为tr_num*tran_record，
 *  成功：返回实际查询的条数 失败：返回非0负值*/
int protocol_queryCD(void *precord, int tr_num);

/*获取离线交易记录，
 * precord 单个结构体的指针
 * index 要查询的第几条离线记录，此值大于等于1
 * 返回值：0成功
 *
 * */
int protocol_get_offlineCD_byIndex(void *precord, int index);

/*
 * 获取离线交易记录，
 * precord 单个结构体的指针
 * 返回值：0成功
 * */
int protocol_get_offlineCD(void *precord);

/*
 *通过现有的交易流水号获取交易记录信息
 * precord 单个结构体的指针,且交易流水号不为空
 * 返回值：0成功
 * */
int protocol_getCD_bySerialnum(void *precord);

/*
 * 根据卡号获取未完整交易记录
 * cardNum为调用者填充的卡号, precord为动态库查询成功时填充未完整交易记录
 * 返回值：0查询成功，其他值：查询不到
 * */
int protocol_get_offlineCD_byCardnum(unsigned char cardNum[8], void *precord);

/*=====================================*/

//故障记录更新、查询
/*err是指向err_record的指针，成功返回ERROR_OK*/
int protocol_updateERR(err_record* err);
/*err是指向err_record的数组，数组大小为err_record*err_num,err_num是要查询的条数，成功返回实际查询的数量*/
int protocol_queryERR(err_record *err, int err_num);

////系统设置更新、查询
//int protocol_updateSYSCONF(sysset_cmd* sys);//sys是指向sysset_cmd的指针，成功返回ERROR_OK
//int protocol_querySYSCONF(sysset_cmd* sys);//sys是指向sysset_cmd的指针，成功返回ERROR_OK
//
////计费模型更新、查询
//int protocol_updatePM(charg_model* mode);//mode是指向charg_model的指针，成功返回ERROR_OK
//int protocol_queryPM(charg_model* mode);//mode是指向charg_model的指针，成功返回ERROR_OK

//管理卡更新、查询
int protocol_updateCard(admin_card* card, char operation); //card是指向admin_card的指针,operation=1表示插入，operation=2表示删除，成功返回ERROR_OK
int protocol_queryCard(admin_card* card); //card是admin的数组，大小为5个admin_card大小,成功返回ERROR_OK

//黑名单更新，查询
int protocol_update_blacklistCard(blacklist_card* card); //黑名单卡更新   成功返回ERROR_OK
int protocol_blacklistCard_isExist(char cardNum[8]); //卡号是否存在于黑名单中 0不存在  1存在

//充电枪配置 成功返回ERROR_OK
int protocol_update_GunInfo(Gun_Info* gun_info); //更新、插入充电枪信息
int protocol_get_GunInfo(unsigned char gunno, Gun_Info* gun_info); //获取充电枪信息, gun_info由调用者传递,数据库填充
int protocol_delete_GunInfo(unsigned char gunno); //删除充电枪信息

//故障代码和停止原因代码   swcode是要查询的晟伟代码， pcode是要返回查询的具体信息  成功返回ERROR_OK
int protocol_get_YxCode(unsigned int swcode, Display_Code* pcode);
int protocol_get_StopReasonCode(unsigned int swcode, Display_Code* pcode);

//成功更新返回ERROR_OK  更新依据为sw_code
int protocol_update_YxCode(Display_Code* pcode);
int protocol_update_StopReasonCode(Display_Code* pcode);

int protocol_delete_YxCode(unsigned int swcode);
int protocol_delete_StopReasonCode(unsigned int swcode);


//成功更新返回ERROR_OK  model指向price_model的结构对象
int protocol_get_PriceModel(void* model);
int protocol_update_PriceModel(void* model);

#ifdef __cplusplus
}
#endif

#endif
